package com.yugao.fintech.antelope.mps.api.model.content;

import com.alibaba.fastjson2.JSONObject;
import com.yugao.fintech.antelope.base.model.constants.ValidationCons;
import com.yugao.fintech.antelope.mps.api.model.content.template.TemplateVarData;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotEmpty;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;


@Getter
@Setter
@Accessors(chain = true)
public abstract class BaseMsgContent {
    protected String title;

    /**
     * 渠道类型
     */
    @NotEmpty(message = ValidationCons.NOT_EMPTY)
    private String channelType;

    /**
     * 消息推送任务编码
     */
    @NotEmpty(message = ValidationCons.NOT_EMPTY)
    protected String taskCode;

    /**
     * 自定义关联的业务主键
     */
    private String bizKey;

    /**
     * 自定义关联业务类型
     */
    private String bizType;

    /**
     * 接收用户的登录id, 目前只有推送站内信的时候才会用到, 其他不会用到
     */
    private String loginId = "*";

    /**
     * 接受者用户编码，可直接指定接受者手机号或邮箱地址等
     */
    private String toUser;

    /**
     * 计划推送时间（指定推送时间，延迟推送）
     */
    private LocalDateTime planPushDate;

    /**
     * 模板配置
     */
    protected List<TemplateVarData> tplDataList = new ArrayList<>();

    /**
     * 将字符串转成当前的对象
     * @param jsonStr json字符串
     * @return 子类对象
     */
    public abstract BaseMsgContent jsonToObj(String jsonStr);

    public BaseMsgContent addAllTplData(List<TemplateVarData> templateVarData) {
        this.tplDataList.addAll(templateVarData);
        return this;
    }

    public BaseMsgContent addTplData(String key, Object value) {
        this.tplDataList.add(new TemplateVarData(key, value, null));
        return this;
    }

    public BaseMsgContent addAllTplData(JSONObject data) {
        data.forEach((k, v) -> this.tplDataList.add(new TemplateVarData(k, v, "")));
        return this;
    }

    public BaseMsgContent addTplData(String key, Object value, String color) {
        this.tplDataList.add(new TemplateVarData(key, value, color));
        return this;
    }

    /**
     * 在多久之后推送通知
     */
    public void pushAfter(Duration duration) {
        this.planPushDate = LocalDateTime.now().plusSeconds(duration.getSeconds());
    }
}
